]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
Avoid warnings on null actors for tray icons
authorGiovanni Campagna <gcampagna@src.gnome.org>
Sun, 24 Oct 2010 12:26:50 +0000 (14:26 +0200)
committerGiovanni Campagna <gcampagna@src.gnome.org>
Mon, 25 Oct 2010 13:18:07 +0000 (15:18 +0200)
Plugging the GtkSocket icon can fail, in which case NaTrayManager emits
tray-icon-removed but the icon has never emitted plug-added, thus the
ShellTrayIcon has not been created. This results in various criticals
and exceptions in the tray-icon-removed handler.

https://bugzilla.gnome.org/show_bug.cgi?id=633028

src/shell-tray-manager.c
src/tray/na-tray-manager.c

index ada5f4c05f42bb60f4a91b9097748479c685127c..37368dab36f4b742d49c760f51cae1669e50a2ff 100644 (file)
@@ -60,11 +60,13 @@ free_tray_icon (gpointer data)
 {
   ShellTrayManagerChild *child = data;
 
-  gtk_widget_hide (child->window);
   gtk_widget_destroy (child->window);
-  g_signal_handlers_disconnect_matched (child->actor, G_SIGNAL_MATCH_DATA,
-                                        0, 0, NULL, NULL, child);
-  g_object_unref (child->actor);
+  if (child->actor)
+    {
+      g_signal_handlers_disconnect_matched (child->actor, G_SIGNAL_MATCH_DATA,
+                                            0, 0, NULL, NULL, child);
+      g_object_unref (child->actor);
+    }
   g_slice_free (ShellTrayManagerChild, child);
 }
 
@@ -314,8 +316,14 @@ na_tray_icon_removed (NaTrayManager *na_manager, GtkWidget *socket,
   child = g_hash_table_lookup (manager->priv->icons, socket);
   g_return_if_fail (child != NULL);
 
-  g_signal_emit (manager,
-                 shell_tray_manager_signals[TRAY_ICON_REMOVED], 0,
-                 child->actor);
+  if (child->actor != NULL)
+    {
+      /* Only emit signal if a corresponding tray-icon-added signal was emitted,
+         that is, if embedding did not fail and we got a plug-added
+      */
+      g_signal_emit (manager,
+                     shell_tray_manager_signals[TRAY_ICON_REMOVED], 0,
+                     child->actor);
+    }
   g_hash_table_remove (manager->priv->icons, socket);
 }
index 5a0b3bd79a55d1ae145bf6f8255a9343d0f9103a..bccda638e5e1f074531047240b7e478ca521cb8d 100644 (file)
@@ -300,8 +300,8 @@ na_tray_manager_handle_dock_request (NaTrayManager       *manager,
   if (!gtk_socket_get_plug_window (GTK_SOCKET (child)))
     {
       /* Embedding failed, we won't get a plug-removed signal */
+      /* This signal destroys the socket */
       g_signal_emit (manager, manager_signals[TRAY_ICON_REMOVED], 0, child);
-      gtk_widget_destroy (child);
       return;
     }